'''
***装饰器
装饰器的目的：允许你动态地修改函数，并且不改变函数本身,是python的高级高级功能
装饰器本质上是一个函数，能接收一个函数作为参数，并且返回一个新的函数
这个新的函数通常会在执行原函数之前或之后添加一些额外的功能或行为

装饰器的应用场景：
日志记录: 装饰器可用于记录函数的调用信息、参数和返回值。
性能分析: 可以使用装饰器来测量函数的执行时间。
权限控制: 装饰器可用于限制对某些函数的访问权限。
缓存: 装饰器可用于实现函数结果的缓存，以提高性能。

考点：
什么是装饰器
你使用过哪些装饰器
'''
import time

def add():
    # 记录一个时间 时间戳 1970.1.1 0:0:0开始到现在的一个时间秒数
    time1 = time.time() # 1762324371.2624238
    print(time1)
    # 执行一段代码 系统休眠 2s
    # time.sleep(2)
    ran(1000000)
    # 记录一个时间
    time2 = time.time()
    # 获取这段代码的执行时间
    print(time2-time1)

def add1():
    # 记录一个时间 时间戳 1970.1.1 0:0:0开始到现在的一个时间秒数
    time1 = time.time() # 1762324371.2624238
    print(time1)
    # 执行一段代码 系统休眠 2s
    # time.sleep(2)
    ran1(1000000)
    # 记录一个时间
    time2 = time.time()
    # 获取这段代码的执行时间
    print(time2-time1)

def ran(n):
    sum = 0
    for i in range(n):
        sum+=i

def ran1():
    pass
# add()
print("---------------------")
# 装饰器  不改变原函数的情况下，在运行过程中，给函数动态增加功能的一种实现方式。
def timecost(funct):
    def wrapper(*args,**keys):
        # 给参数函数添加功能
        # 函数执行前的代码
        time1 = time.time()
        # 函数执行
        r = funct(*args,**keys)
        # 函数执行后的代码
        time2 = time.time()
        print(f"函数{funct.__name__}的执行时间为：{time2-time1}")
        return r
    return wrapper

# 使用装饰器 在需要查看性能的函数上面使用该装饰器 @timecost
@timecost
def ran2(n):
    sum = 0
    for i in range(n):
        sum+=i

@timecost
def ran3():
    time.sleep(3)


def ran4():
    time.sleep(2)
    print("-*****-")
# ran2(10000000)
# ran3()
# ran4()


# 定义一个装饰器，用来记录日志 调用了哪个函数，参数  返回值
def logger(func):
    def inner(*args,**keys):
        # 函数执行前
        print(f"----我要开始调用-{func.__name__}-函数了，参数：[{args}][{keys}]---------")
        # 函数执行
        ret = func(*args,**keys)

        # 函数执行后的代码
        print(f"----{func.__name__}-函数执行结束了，执行结果为--{ret}---------")
        return ret
    return  inner

@logger
def ran5(n,m):
    time.sleep(2)
    print("-*****-")
    return n+m

ran5(3,4)



